#include "tcp_server.hpp"
#include "../core/connection_manager.hpp"
#include <iostream>

/**
 * @brief 构造函数实现
 * @param io_context Boost.Asio IO上下文
 * @param address 服务器监听地址
 * @param port 服务器监听端口
 * @param connection_callback 连接建立时的回调函数
 */
TcpServer::TcpServer(boost::asio::io_context& io_context, 
                     const std::string& address, 
                     unsigned short port,
                     IMessageReceiver& message_receiver,
                     ConnectionCallback connection_callback)
    : io_context_(io_context),
      acceptor_(io_context, tcp::endpoint(boost::asio::ip::make_address(address), port)),
      message_receiver_(message_receiver),
      connection_callback_(connection_callback){
    
}

/**
 * @brief 启动服务器
 * 由于在构造函数中已经调用了do_accept()，这里不需要额外操作
 */
void TcpServer::start() {
    do_accept();
}

/**
 * @brief 停止服务器
 * 关闭监听器，停止接受新的连接
 */
void TcpServer::stop() {
    acceptor_.close();
}

/**
 * @brief 异步接受新的客户端连接
 * 使用异步操作接受新的连接，当有新连接时创建新的会话
 */
void TcpServer::do_accept() {
    acceptor_.async_accept(
        [this](boost::system::error_code ec, tcp::socket socket) {
            if (!ec) {
                // 创建新的会话对象
                auto session = std::make_shared<TcpSession>(std::move(socket), message_receiver_);
                
                // 将会话添加到连接管理器
                uint32_t session_id = ConnectionManager::get_instance().add_connection(session);

                // 设置会话ID
                session->set_session_id(session_id);
                
                // 如果有回调函数，通知业务层新连接已建立
                if (connection_callback_) {
                    connection_callback_(session);
                }
                
                // 启动会话
                session->start();
            } else {
                // 处理连接错误
                std::cerr << "接受连接错误: " << ec.message() << std::endl;
            }

            // 继续接受新的连接
            do_accept();
        });
}